package com.company.utils;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.UUID;

public class MyUtils {

    /**
     * 文件上传方法
     *
     * @param multipartFile  文件流对象
     * @param strUploadfiles    服务器保存上传文件的目录名
     * @param strFileNamePrefix     服务器新命名的新前缀 【新前缀+UUID+文件类型后缀】
     * @param objBean   实体类参数【保存上传文件的相对路径】
     * @param beanFilePropetyName   实体类的属性名【保存上传文件相对路径的属性名】
     */
    public  static  void doSingleFileUpload(
            MultipartFile multipartFile,
            String strUploadfiles,
            String strFileNamePrefix,
            Object objBean,
            String beanFilePropetyName){//接口设计


        //文件上传分三步
        // 1.从前台表单将文件上传的服务器，注入给MultipartFile对象，MultipartFile对象存入服务器
        //2.解析MultipartFile对象，生成文件目录，
        //3.进行文件的上传

        /////////////////////////文件上传处理/////////////////////////////

        //上传文件的命名规则
        //上传文件的位置
        //通过system工具类获取当前服务器发布的地址

        /*
        使用 System.getProperty("server.basePath");
        获取服务器的绝对路径地址，需要在web.xml中配置 org.springframework.web.util.WebAppRootListener 监听器
         */
        //获取的是项目在在服务器发布的根目录的地址
        String strBasePath = System.getProperty("server.basePath");//监听器的绝对路径
        System.out.println("服务器根据路地址：" + strBasePath);


        //定义上传文件的目录名
        //String strUploadfiles = "uploadfiles";
        //把上传文件目录放在静态资源解析的文件夹中
        String strfullDirectoryPath = strBasePath + File.separator+"static"+File.separator
                +strUploadfiles +File.separator;

        File uploadDirectory = new File(strfullDirectoryPath);

        // File uploadFile = new File(strfullDirectoryPath);

        if (!uploadDirectory.exists()){
            //创建目录
            uploadDirectory.mkdirs();
        }
        //上传文件重新命名

        //获取原文件名，并通过源文件名.jpg，获取文件的后缀名
        String strOriginalFilename = multipartFile.getOriginalFilename();
        //获取原文件的后缀
        String strFileSufix = StringUtils.substringAfterLast(strOriginalFilename,".");
        //UUID生成新的文件名（防止重复）
        String strFileNewName = strFileNamePrefix + UUID.randomUUID().toString()+"."+strFileSufix;
        //创建新的上传文件对象绝对路径
        String uploadNewFileName = strfullDirectoryPath + File.separator + strFileNewName;
        //新上传的文件
        File uploadNewFile = new File(uploadNewFileName);


        try {
            //创建上传文件
            multipartFile.transferTo(uploadNewFile);
            //使用反射，但是借助Apache的commons的BeanUtils工具类进行实体类
            //文件上传成功以后，将新上传的文件的服务器的相对路径保存到参数实体类的指定的属性字段上
            BeanUtils.setProperty(objBean, beanFilePropetyName,
                    "static" + File.separator
                    + strUploadfiles + File.separator + strFileNewName);

        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("文件上传失败" + e.getMessage());
        }
        ///////////////////////////////////////////////////////////////

    }
}
